<?php
function substr_utf8($str, $length, $start = 0, $suffix = '...')
{
    if (empty( $str ))
    {
        return $str;
    }
    
    $suffix_len = strlen( $suffix );
    if ($length <= $suffix_len)
    {
        $suffix = '';
        $suffix_len = 0;
    }
    
    if (function_exists( 'mb_strlen' ) && function_exists( 'mb_substr' ))
    {
        if (mb_strlen( $str, 'UTF-8' ) > $start + $length)
        {
            return mb_substr( $str, $start, $length - $suffix_len, 'UTF-8' ) . $suffix;
        }
        elseif ($start > 0)
        {
            return mb_substr( $str, $start, $length, 'UTF-8' );
        }
        else
        {
            return $str;
        }
    }
    
    // c:第几个字符；bi：开始字节；si，ei：结束字节
    $i = $c = $bi = $si = $ei = 0;
    $len = strlen( $str );
    while ( $i < $len )
    {
        $ord = ord( $str{$i} );
        // 通过分析utf8编码规则，发现一个正常字符的utf8编码可以分为两种情况：
        // 1.一个字节就是字符（ASII码）
        // 2.一个大于192的字节后面跟1~5个[128-192)的“填充”字节表示一个字符
        // 所以可以计算不在[128-192)范围内的字节数作为实际的字符数，
        // 通过记录实际字符在字节中的位置，调用字节截断来实现字符串截断。
        if ($ord < 128 || $ord >= 192)
        {
            if ($c == $start)
            {
                $bi = $i;
            }
            elseif ($c == $start + $length - $suffix_len)
            {
                $si = $i;
            }
            if ($c == $start + $length)
            {
                $ei = $i;
                break;
            }
            $c ++;
        }
        $i ++;
    }
    if ($ei == 0)
    {
        $ei = $len;
    }
    if ($ei < $len)
    {
        return substr( $str, $bi, $si - $bi ) . $suffix;
    }
    else
    {
        return substr( $str, $bi, $ei - $bi );
    }
}
function up_path($key = 'img')
{
    $CI = & get_instance();
    if (empty( $CI->upload_folder[$key] ))
    {
        return '';
    }
    return '../' . $CI->upload_folder[$key];
}